import random
import math
from unite import *
from batiment import *
class Intelligence(object):
    def __init__(self,nom,etoileDepart,uniteDepart, couleur):
        self.nom=nom
        self.gold=5000
        self.pMilitaire=0
        self.pScience=0
        self.pEchange=0
        self.augmentationargent=0
        self.unites=[uniteDepart]
        self.etoiles=[etoileDepart]
        self.etat = "normal"
        self.actionsEnCours=[]
        self.destExplorer=""
        self.joueursConnus={}
        self.bin = []
        self.couleur=couleur
        self.etatBO = "debut"
        self.victime = None
        self.etoileCible = None
        self.uniteCible = None
        
    def tic(self, univers):
        self.bin = []
        self.augmenterArgent(univers)
        if self.etat == "normal":
            scout = self.trouverUnScout(univers)
            if scout == -1:
                if self.verifierRessources("unite", "scout", 0, univers):
                    self.construireUnite('scout', univers)
            else:
                self.explorer(scout, univers)
            self.buildingOrder(univers)
            if self.etatBO == "fini":
                self.construireArmee(univers)
            if len(self.unites)>4:
                self.etat = "attaque"
        elif self.etat == "attaque":
            self.orchestrerAttaque(univers)
                
        return self.bin
    
    def augmenterArgent(self, univers):
        augmentation = 0
        for i in self.etoiles:
            augmentation += univers.tabEtoiles[i].population/20
        self.gold += augmentation
    
    def choisirVictime(self):
        if len(self.joueursConnus) > 0:
            listeNoms = []
            for joueur in self.joueursConnus:
                listeNoms.append(joueur)
            i = random.randrange(len(listeNoms))
            self.victime = listeNoms[i]
    
    def orchestrerAttaque(self, univers):
        #victime choisie, attaque pas initiee
        if self.victime and self.etoileCible == None and "attaque" not in self.actionsEnCours:
            self.etoileCible = self.joueursConnus[self.victime][0]
            del self.joueursConnus[self.victime][0]
            if len(self.joueursConnus[self.victime])==0:
                del self.joueursConnus[self.victime]
                
        #victime choisie, etoile cible choisie
        elif self.victime and self.etoileCible and "attaque" not in self.actionsEnCours:
            #unite choisie
            if self.uniteCible:
                for unite in self.unites:
                    if univers.tabUnites[unite].type <> "scout":
                        self.actionsEnCours.append("attaque")
                        self.bin.append(["attaque", unite, self.uniteCible])
            #choisir unite
            else:
                etoile = univers.tabEtoiles[self.etoileCible]
                compteur = 0
                uniteTrouvee = False
                for unite in univers.tabUnites:
                    if unite.proprietaire == self.victime:
                        distance = math.sqrt(math.pow(abs((etoile.x-unite.x)),2)+math.pow(abs((etoile.y-unite.y)),2)+math.pow(abs((etoile.z-unite.z)),2))
                        if distance < 800:
                            self.uniteCible = compteur
                            uniteTrouvee = True
                    compteur += 1
                #Dans le cas ou tout le monde autour est mort
                if uniteTrouvee == False:
                    del self.joueursConnus[self.victime][self.etoileCible]
                    #Dans le cas ou on ne connait plus d'etoiles appartenant a la victime
                    if len(self.joueursConnus[self.victime]) == 0:
                        del self.joueursConnus[self.victime]
                        self.etoileCible = None
                        self.victime = None
        #attaque initiee, verification de la vie de la cible
        elif self.victime and self.etoileCible and self.uniteCible:
            cible = univers.tabUnites[self.uniteCible]
            if cible.statut == "mort":
                self.uniteCible = None
        else:
            self.choisirVictime()
    
    def verifierRessources(self, aConstruire, type, indexEtoile, univers):
        etoile = univers.tabEtoiles[indexEtoile]
        if aConstruire == "unite":
            coutMinerai = CONSTANTESUNITES.unites[type]['minerai']
            coutGaz = CONSTANTESUNITES.unites[type]['gaz']
            coutGold = CONSTANTESUNITES.unites[type]['cout']
        elif aConstruire == "structure":
            coutMinerai = CONSTANTESBATIMENTS.structures[type]['minerai']
            coutGaz = CONSTANTESBATIMENTS.structures[type]['gaz']
            coutGold = CONSTANTESBATIMENTS.structures[type]['cout']
        elif aConstruire == "batiment":
            coutMinerai = CONSTANTESBATIMENTS.batiments[type]['coutMinerai']
            coutGaz = CONSTANTESBATIMENTS.batiments[type]['coutGaz']
            coutGold = CONSTANTESBATIMENTS.batiments[type]['coutGold']
        
        if  self.gold >= coutGold and etoile.gaz >= coutGaz and etoile.minerai >= coutMinerai:
            self.gold -= coutGold
            etoile.minerai -= coutMinerai
            etoile.gaz -= coutGaz
            return True
        else:
            return False
    
    def construireUnite(self, type, univers):
        self.unites.append(len(univers.tabUnites))
        self.bin.append(["creerUnite",self.etoiles[0], type])
        print self.nom + " cree un " +type
            
    def trouverUnScout(self, univers):
        rep = -1
        for unite in self.unites:
            potentiel = univers.tabUnites[unite]
            if potentiel.type == "scout" and potentiel.statut=="vivant":
                rep = unite
        return rep
    
    def explorer(self, scout, univers):
        if "explorer" in self.actionsEnCours:
            distance = math.sqrt(math.pow(abs((univers.tabUnites[scout].x-univers.tabEtoiles[self.destExplorer].x)),2)+math.pow(abs((univers.tabUnites[scout].y-univers.tabEtoiles[self.destExplorer].y)),2)+math.pow(abs((univers.tabUnites[scout].z-univers.tabEtoiles[self.destExplorer].z)),2))
            if distance < 20:
                proprietaire = univers.tabEtoiles[self.destExplorer].proprietaire
                if proprietaire <> "":
                    if proprietaire not in self.joueursConnus:
                        self.joueursConnus[proprietaire] = [self.destExplorer]
                    else:
                        self.joueursConnus[proprietaire].append(self.destExplorer)
                        
                self.actionsEnCours.remove("explorer")                
                        
        else:
            self.destExplorer = random.randrange(len(univers.tabEtoiles))
            if self.destExplorer not in self.etoiles:
                x = univers.tabEtoiles[self.destExplorer].x + random.randrange(10)
                y = univers.tabEtoiles[self.destExplorer].y + random.randrange(10)
                z = univers.tabEtoiles[self.destExplorer].z + random.randrange(10)
                self.bin.append(["mvt",scout,x,y,z])
                self.actionsEnCours.append("explorer")
    
    def construireBuilding(self, planete, type):
        batiment = Batiment(type, planete)
        planete.batiments.append(batiment)
        print self.nom + " cree un " +type
        
    def construireStructure(self, etoile, type):
        structure = Structure(type, etoile)
        etoile.tabStructures.append(structure)
        print self.nom + " cree un " +type
        
    def buildingOrder(self, univers):
        etoile = univers.tabEtoiles[self.etoiles[len(self.etoiles)-1]]
        if self.etatBO == "debut":
            indexPlanete = self.trouverPlanete("Gazeuse", etoile)
            if indexPlanete <> -1:
                planete = etoile.tabPlanetes[indexPlanete]
                if self.verifierRessources("batiment", "extracteurGaz", self.etoiles[len(self.etoiles)-1], univers):
                    self.construireBuilding(planete, "extracteurGaz")
                    self.etatBO = "minerai"
            else:
                self.etatBO = "minerai"
                
        elif self.etatBO == "minerai":
            indexPlanete = self.trouverPlanete("Morte", etoile)
            if indexPlanete <> -1:
                planete = etoile.tabPlanetes[indexPlanete]
                if self.verifierRessources("batiment", "extracteurMinerai", self.etoiles[len(self.etoiles)-1], univers):
                    self.construireBuilding(planete, "extracteurMinerai")
                    self.etatBO = "ferme"
            else:
                self.etatBO = "ferme"
        elif self.etatBO == "ferme":
            indexPlanete = self.trouverPlanete("Habitable", etoile)
            if indexPlanete <> -1:
                planete = etoile.tabPlanetes[indexPlanete]
                if self.verifierRessources("batiment", "agricultureFerme", self.etoiles[len(self.etoiles)-1], univers):
                    self.construireBuilding(planete, "agricultureFerme")
                    self.etatBO = "attaque"
            else:
                self.etatBO = "attaque"
                
        elif self.etatBO == "attaque":
            if self.verifierRessources("structure", "usineAttaque", self.etoiles[len(self.etoiles)-1], univers):
                self.construireStructure(etoile, "usineAttaque")
                self.etatBO = "defense"

                
        elif self.etatBO == "defense":
            if self.verifierRessources("structure", "usineDefense", self.etoiles[len(self.etoiles)-1], univers):
                self.construireStructure(etoile, "usineDefense")
                self.etatBO = "fini"
            
                
    def trouverPlanete(self, type, etoile):
        planete = 0
        for i in etoile.tabPlanetes:
            if i.type == type:
                return planete
            planete+=1
        return -1
    
    def construireArmee(self, univers):
        compteReparateurs = 0
        compteShieldDiruptors = 0
        compteLents = 0
        compteRapides = 0
        compteMotherShips = 0
        for i in self.unites:
            if univers.tabUnites[i].type == "reparateur":
                compteReparateurs += 1
            elif univers.tabUnites[i].type == "shieldDisruptor":
                compteShieldDisruptors += 1
            elif univers.tabUnites[i].type == "lent":
                compteLents += 1
            elif univers.tabUnites[i].type == "rapide":
                compteRapides += 1
            elif univers.tabUnites[i].type == "motherShip":
                compteMotherShips += 1
        total = len(self.unites)+1
        if (float(compteRapides)/total)*100 < 50:
            compteur = 0
            etoileTrouvee = False
            while compteur < len(self.etoiles):
                if etoileTrouvee == False:
                    if self.verifierRessources("unite", "rapide", self.etoiles[compteur], univers):
                        etoileTrouvee = True
                compteur += 1
            if etoileTrouvee:
                print str(compteRapides)+"    "+str((float(compteRapides)/total)*100)
                self.construireUnite("rapide", univers)
                
        elif (float(compteLents)/total)*100 < 40:
            compteur = 0
            etoileTrouvee = False
            while compteur < len(self.etoiles):
                if etoileTrouvee == False:
                    if self.verifierRessources("unite", "lent", self.etoiles[compteur], univers):
                        etoileTrouvee = True
                compteur += 1
            if etoileTrouvee:
                self.construireUnite("lent", univers)
        
        elif (float(compteReparateurs)/total)*100 < 5:
            compteur = 0
            etoileTrouvee = False
            while compteur < len(self.etoiles):
                if etoileTrouvee == False:
                    if self.verifierRessources("unite", "reparateur", self.etoiles[compteur], univers):
                        etoileTrouvee = True
                compteur += 1
            if etoileTrouvee:
                self.construireUnite("reparateur", univers)
                
        elif (float(compteShieldDisruptors)/total)*100 < 5:
            compteur = 0
            etoileTrouvee = False
            while compteur < len(self.etoiles):
                if etoileTrouvee == False:
                    if self.verifierRessources("unite", "shieldDisruptor", self.etoiles[compteur], univers):
                        etoileTrouvee = True
                compteur += 1
            if etoileTrouvee:
                self.construireUnite("shieldDisruptor", univers)
                
        elif total > 15 and float(total)/15 > compteMotherShip:
            compteur = 0
            etoileTrouvee = False
            while compteur < len(self.etoiles):
                if etoileTrouvee == False:
                    if self.verifierRessources("unite", "motherShip", self.etoiles[compteur], univers):
                        etoileTrouvee = True
                compteur += 1
            if etoileTrouvee:
                self.construireUnite("motherShip", univers)